package com.masita.logica;

import java.sql.*;
import java.util.Vector;

public class Ficha {

	// CAMPOS DE FICHA **
	private int id_ficha;
	
	private int id_cliente;
	private Cliente cliente;
	
	private String fecha_carga;
	// *******************
	
	private Vector ventas;
	private Vector pedidos;
	private Vector reclamos;
	private Vector entregas;
	
	public Ficha(int id_f, int id_c, String fec){
		this.id_ficha = id_f;
		this.fecha_carga = new String(fec);
		this.id_cliente = id_c;
		
		this.cliente = null;
		this.ventas = null;
		this.pedidos = null;
		this.reclamos = null;
		this.entregas = null;		 	
	}

	// METODO GET DE LA CLASE *****************************
	public Cliente getCliente(){
		if( this.cliente == null && this.id_cliente != 0 )
			this.cliente = Cliente.getCliente(this.id_cliente); 
		return cliente;
	}
	// VENTAS PENDIENTES Y TODAS LAS VENTAS DE LA FICHA
	public Vector getVentasPendientes(){
		if( this.ventas == null && this.id_ficha != 0 )
			this.ventas = Venta.getVentasPendientes(this.id_ficha);
		return ventas;
	}

	public Vector getVentas(){
		return Venta.getVentas(this.id_ficha);
	}
	// ****************************************************
	public Vector getPedidosNoEntregados(){
		if( this.pedidos == null && this.id_ficha != 0 )
			this.pedidos = Pedido.getPedidosNoEntregados(this.id_ficha);
		return pedidos;
	}

	public Vector getEntregasCondicionadas(){
		if( this.entregas == null && this.id_ficha != 0 )
			this.entregas = EntregaCondicionada.getEntregasCondicionadas(this.id_ficha);
		return entregas;
	}

	public Vector getReclamosPendientes(){	// PARA OBTENER SOLO LOS RECLAMOS PENDIENTES
		if( this.reclamos == null && this.id_ficha != 0 )
			this.reclamos = Reclamo.getReclamosPendientes(this.id_ficha);
		return reclamos;
	}

	public Vector getReclamos(){	// PARA OBTENER TODOS LOS RECLAMOS
		if( this.id_ficha != 0 )
			this.reclamos = Reclamo.getReclamos(this.id_ficha);
		return reclamos;
	}

	public String getFechaCarga(){
		return fecha_carga;
	}

	public int getIdCliente(){
		return id_cliente;
	}

	public int getIdFicha(){
		return id_ficha;
	}

	// METODO SET DE LA CLASE *****************************
	public void setCliente(Cliente cli){
		if( cli != null )
			this.id_cliente = cli.getIdCliente();
		this.cliente = cli;
	}

	public void setFechaCarga(String string){
		fecha_carga = new String(string);
	}

	public void setIdCliente(int i){
		id_cliente = i;
		this.cliente = null;
	}
	
	public void setPedidosNoEntregados(Vector ped){
		this.pedidos = ped; 
	}

	// METODO ADD Y REMOVE DETALLE Y CUOTA ****************
	// VENTAS *********************************************
	public void addVenta(Venta venta){
		if( venta != null ){
			if( this.getVentasPendientes() == null ) this.ventas = new Vector();
			this.ventas.addElement(venta);
		}
	}
	
	public void removeVenta(Venta venta){
		if( venta != null ){
			if( this.getVentasPendientes().indexOf(venta) != -1 )
				this.ventas.removeElement(venta);
		}
	}
	// PEDIDOS ********************************************
	public void addPedido(Pedido pedido){
		if( pedido != null ){
			if( this.getPedidosNoEntregados() == null ) this.pedidos = new Vector();
			this.pedidos.addElement(pedido);
		}
	}
	
	public void removePedido(Pedido pedido){
		if( pedido != null ){
			if( this.getPedidosNoEntregados().indexOf(pedido) != -1 )
				this.pedidos.removeElement(pedido);
		}
	}
	// RECLAMOS *******************************************
	public void addReclamo(Reclamo reclamo){
		if( reclamo != null ){
			if( this.getReclamosPendientes() == null ) this.reclamos = new Vector();
			this.reclamos.addElement(reclamo);
		}
	}
	
	public void removeReclamo(Reclamo reclamo){
		if( reclamo != null ){
			if( this.getReclamosPendientes().indexOf(reclamo) != -1 )
				this.reclamos.removeElement(reclamo);
		}
	}
	// ENTREGAS CONDICIONADAS *****************************
	public void addEntrega(EntregaCondicionada entrega){
		if( entrega != null ){
			if( this.getEntregasCondicionadas() == null ) this.entregas = new Vector();
			this.entregas.addElement(entrega);
		}
	}
	
	public void removeEntrega(EntregaCondicionada entrega){
		if( entrega != null ){
			if( this.getEntregasCondicionadas().indexOf(entrega) != -1 )
				this.entregas.removeElement(entrega);
		}
	}
		
	// METODO S ESTATICOS DE LA CLASE *********************
	public static Ficha getFicha(int id){
		try{
			Statement st = Conexion.getStatement();
			String sentencia = "SELECT * FROM ficha WHERE id_ficha = "+id;
			ResultSet rs = st.executeQuery(sentencia);
			if( rs.next() ){
				return new Ficha(rs.getInt("id_ficha"),
								 rs.getInt("id_cliente"),
								 rs.getString("fecha_carga"));
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return null;
	}
	
	public static Ficha getFichaPorCliente(int id_c){
		try{
			Statement st = Conexion.getStatement();
			String sentencia = "SELECT * FROM ficha WHERE id_cliente = "+id_c;
			ResultSet rs = st.executeQuery(sentencia);
			if( rs.next() ){
				return new Ficha(rs.getInt("id_ficha"),
								 rs.getInt("id_cliente"),
								 rs.getString("fecha_carga"));
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return null;
	}

	// METODO GUARDARDATOS DE LA CLASE ********************
	
	public int guardarDatos(){
		try{
			Statement st = Conexion.getStatement();
			String sentencia;
			
			if( this.id_ficha == 0 ){
				sentencia = "INSERT INTO ficha VALUES(0,"+
							this.id_cliente+",'"+this.fecha_carga+"')";
				st.executeUpdate(sentencia);
				ResultSet rs = st.getGeneratedKeys();
				if( rs.next() ) this.id_ficha = rs.getInt(1);
			} // NO TIENE UPDATE PORQUE LA FICHA NO PUEDE 
			  // CAMBIAR DE CLIENTE Y TAMPOCO PUEDE CAMBIAR 
			  // LA FECHA DE CARGA
						
			if( this.ventas != null ){
				for(int i=0; i<this.ventas.size(); i++){
					Venta venta = (Venta)this.ventas.elementAt(i);
					venta.setIdFicha(this.id_ficha);
					if( venta.getIdVenta() == 0 ){ // actualiza el stock del
												   // producto
						venta.registrarVenta();
					}
					else{ // guarda las ventas y sus cuotas
						venta.guardarDatos();
					}
				}
			}
			
			if( this.pedidos != null ){
				for(int i=0; i<this.pedidos.size(); i++){
					Pedido pedido = (Pedido)this.pedidos.elementAt(i);
					pedido.setIdFicha(this.id_ficha);
					pedido.guardarDatos();
				}
			}

			if( this.reclamos != null ){
				for(int i=0; i<this.reclamos.size(); i++){
					Reclamo reclamo = (Reclamo)this.reclamos.elementAt(i);
					reclamo.setIdFicha(this.id_ficha);
					reclamo.guardarDatos();
				}
			}

			if( this.entregas != null ){
				for(int i=0; i<this.entregas.size(); i++){
					EntregaCondicionada entrega = (EntregaCondicionada)this.entregas.elementAt(i);
					entrega.setIdFicha(this.id_ficha);
					if( entrega.getIdEntregaCond() == 0 )
						entrega.registrarEntrega();
					else
						entrega.guardarDatos();
				}
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return this.id_ficha;		
	}
	
	// METODO ELIMINAR DE LA CLASE ************************
	public boolean eliminar(){
		try{
			if( this.id_ficha == 0 ) return false;
			
			// eliminar todas las ventas
			Vector listaVentas = this.getVentas(); 
			if( listaVentas != null ){
				for(int i=0; i<listaVentas.size(); i++){
					Venta venta = (Venta)listaVentas.elementAt(i);
					venta.eliminar();
				}
			}
			
			if( this.getPedidosNoEntregados() != null ){
				for(int i=0; i<this.pedidos.size(); i++){
					Pedido pedido = (Pedido)this.pedidos.elementAt(i);
					pedido.eliminar();
				}
			}

			if( this.getReclamos() != null ){
				for(int i=0; i<this.reclamos.size(); i++){
					Reclamo reclamo = (Reclamo)this.reclamos.elementAt(i);
					reclamo.eliminar();
				}
			}

			if( this.getEntregasCondicionadas() != null ){
				for(int i=0; i<this.entregas.size(); i++){
					EntregaCondicionada entrega = (EntregaCondicionada)this.entregas.elementAt(i);
					entrega.eliminar();
				}
			}

			Statement st = Conexion.getStatement();
			String sentencia = "DELETE FROM ficha " +
							   "WHERE id_ficha = "+this.id_ficha;
			st.executeUpdate(sentencia);
			
			return true;
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return false;
	}
	
	public double getSaldoTotal(){
		double saldo = 0;
		for( int i=0; i<this.getVentasPendientes().size(); i++){
			saldo += ((Venta)this.getVentasPendientes().elementAt(i)).getSaldo();
		}
		
		return saldo;
	}
}
